package com.yeskery.nut.extend.mcp.core.schema;

import java.util.Map;

/**
 * 初始化规范
 * @author sprout
 * 2025-04-17 11:10
 */
public abstract class InitializeSchema {

    /**
     * 初始化请求对象
     */
    public static class Request {
        /** 协议版本 */
        private String protocolVersion;
        /** 客户端能力 */
        private ClientCapabilities capabilities;
        /** 客户端信息 */
        private Implementation clientInfo;

        /**
         * 获取协议版本
         * @return 协议版本
         */
        public String getProtocolVersion() {
            return protocolVersion;
        }

        /**
         * 设置协议版本
         * @param protocolVersion 协议版本
         */
        public void setProtocolVersion(String protocolVersion) {
            this.protocolVersion = protocolVersion;
        }

        /**
         * 获取客户端能力
         * @return 客户端能力
         */
        public ClientCapabilities getCapabilities() {
            return capabilities;
        }

        /**
         * 设置客户端能力
         * @param capabilities 客户端能力
         */
        public void setCapabilities(ClientCapabilities capabilities) {
            this.capabilities = capabilities;
        }

        /**
         * 获取客户端信息
         * @return 客户端信息
         */
        public Implementation getClientInfo() {
            return clientInfo;
        }

        /**
         * 设置客户端信息
         * @param clientInfo 客户端信息
         */
        public void setClientInfo(Implementation clientInfo) {
            this.clientInfo = clientInfo;
        }
    }

    /**
     * 客户端能力
     */
    public static class ClientCapabilities {
        /** 实验性功能 */
        private Map<String, Object> experimental;
        /** 根 */
        private RootCapabilities roots;
        /** 采样 */
        private Sampling sampling;

        /**
         * 获取实验性功能
         * @return 实验性功能
         */
        public Map<String, Object> getExperimental() {
            return experimental;
        }

        /**
         * 设置实验性功能
         * @param experimental 实验性功能
         */
        public void setExperimental(Map<String, Object> experimental) {
            this.experimental = experimental;
        }

        /**
         * 获取根
         * @return 根
         */
        public RootCapabilities getRoots() {
            return roots;
        }

        /**
         * 设置根
         * @param roots 根
         */
        public void setRoots(RootCapabilities roots) {
            this.roots = roots;
        }

        /**
         * 获取采样
         * @return 采样
         */
        public Sampling getSampling() {
            return sampling;
        }

        /**
         * 设置采样
         * @param sampling 采样
         */
        public void setSampling(Sampling sampling) {
            this.sampling = sampling;
        }
    }

    /**
     * 采样
     */
    public static class Sampling {
    }

    /**
     * 根
     */
    public static class RootCapabilities {
        /** 发生变化时服务器是否会通知 */
        private Boolean listChanged;

        /**
         * 获取发生变化时服务器是否会通知
         * @return 发生变化时服务器是否会通知
         */
        public Boolean getListChanged() {
            return listChanged;
        }

        /**
         * 设置发生变化时服务器是否会通知
         * @param listChanged 发生变化时服务器是否会通知
         */
        public void setListChanged(Boolean listChanged) {
            this.listChanged = listChanged;
        }
    }

    /**
     * 客户端信息
     */
    public static class Implementation {
        /** 名称 */
        private String name;
        /** 版本 */
        private String version;

        /**
         * 获取名称
         * @return 名称
         */
        public String getName() {
            return name;
        }

        /**
         * 设置名称
         * @param name 名称
         */
        public void setName(String name) {
            this.name = name;
        }

        /**
         * 获取版本
         * @return 版本
         */
        public String getVersion() {
            return version;
        }

        /**
         * 设置版本
         * @param version 版本
         */
        public void setVersion(String version) {
            this.version = version;
        }
    }

    /**
     * 响应对象
     */
    public static class Response {
        /** 协议版本 */
        private String protocolVersion;
        /** 服务器能力 */
        private ServerCapabilities capabilities;
        /** 服务器信息 */
        private Implementation serverInfo;
        /** 使用说明 */
        private String instructions;

        /**
         * 获取协议版本
         * @return 协议版本
         */
        public String getProtocolVersion() {
            return protocolVersion;
        }

        /**
         * 设置协议版本
         * @param protocolVersion 协议版本
         */
        public void setProtocolVersion(String protocolVersion) {
            this.protocolVersion = protocolVersion;
        }

        /**
         * 获取服务器能力
         * @return 服务器能力
         */
        public ServerCapabilities getCapabilities() {
            return capabilities;
        }

        /**
         * 设置服务器能力
         * @param capabilities 服务器能力
         */
        public void setCapabilities(ServerCapabilities capabilities) {
            this.capabilities = capabilities;
        }

        /**
         * 获取服务器信息
         * @return 服务器信息
         */
        public Implementation getServerInfo() {
            return serverInfo;
        }

        /**
         * 设置服务器信息
         * @param serverInfo 服务器信息
         */
        public void setServerInfo(Implementation serverInfo) {
            this.serverInfo = serverInfo;
        }

        /**
         * 获取使用说明
         * @return 使用说明
         */
        public String getInstructions() {
            return instructions;
        }

        /**
         * 设置使用说明
         * @param instructions 使用说明
         */
        public void setInstructions(String instructions) {
            this.instructions = instructions;
        }
    }

    /**
     * 服务器能力
     */
    public static class ServerCapabilities {
        /** 补全能力 */
        private CompletionCapabilities completions;
        /** 实验性功能 */
        private Map<String, Object> experimental;
        /** 日志 */
        private LoggingCapabilities logging;
        /** 提示 */
        private PromptCapabilities prompts;
        /** 资源 */
        private ResourceCapabilities resources;
        /** 工具 */
        private ToolCapabilities tools;

        /**
         * 获取补全能力
         * @return 补全能力
         */
        public CompletionCapabilities getCompletions() {
            return completions;
        }

        /**
         * 设置补全能力
         * @param completions 补全能力
         */
        public void setCompletions(CompletionCapabilities completions) {
            this.completions = completions;
        }

        /**
         * 获取实验性功能
         * @return 实验性功能
         */
        public Map<String, Object> getExperimental() {
            return experimental;
        }

        /**
         * 设置实验性功能
         * @param experimental 实验性功能
         */
        public void setExperimental(Map<String, Object> experimental) {
            this.experimental = experimental;
        }

        /**
         * 获取日志能力
         * @return 日志能力
         */
        public LoggingCapabilities getLogging() {
            return logging;
        }

        /**
         * 设置日志能力
         * @param logging 日志能力
         */
        public void setLogging(LoggingCapabilities logging) {
            this.logging = logging;
        }

        /**
         * 获取提示能力
         * @return 提示能力
         */
        public PromptCapabilities getPrompts() {
            return prompts;
        }

        /**
         * 设置提示能力
         * @param prompts 提示能力
         */
        public void setPrompts(PromptCapabilities prompts) {
            this.prompts = prompts;
        }

        /**
         * 获取资源能力
         * @return 资源能力
         */
        public ResourceCapabilities getResources() {
            return resources;
        }

        /**
         * 设置资源能力
         * @param resources 资源能力
         */
        public void setResources(ResourceCapabilities resources) {
            this.resources = resources;
        }

        /**
         * 获取工具能力
         * @return 工具能力
         */
        public ToolCapabilities getTools() {
            return tools;
        }

        /**
         * 设置工具能力
         * @param tools 工具能力
         */
        public void setTools(ToolCapabilities tools) {
            this.tools = tools;
        }
    }

    /**
     * 补全能力
     */
    public static class CompletionCapabilities {
    }

    /**
     * 日志能力
     */
    public static class LoggingCapabilities {
    }

    /**
     * 提示能力
     */
    public static class PromptCapabilities {
        /** 发生改变时服务器是否会通知 */
        private Boolean listChanged;

        /**
         * 获取发生改变时服务器是否会通知
         * @return 发生改变时服务器是否会通知
         */
        public Boolean getListChanged() {
            return listChanged;
        }

        /**
         * 设置发生改变时服务器是否会通知
         * @param listChanged 发生改变时服务器是否会通知
         */
        public void setListChanged(Boolean listChanged) {
            this.listChanged = listChanged;
        }
    }

    /**
     * 资源能力
     */
    public static class ResourceCapabilities {
        /** 是否订阅 */
        private Boolean subscribe;
        /** 发生改变时服务器是否会通知 */
        private Boolean listChanged;

        /**
         * 获取是否订阅
         * @return 是否订阅
         */
        public Boolean getSubscribe() {
            return subscribe;
        }

        /**
         * 设置是否订阅
         * @param subscribe 是否订阅
         */
        public void setSubscribe(Boolean subscribe) {
            this.subscribe = subscribe;
        }

        /**
         * 获取发生改变时服务器是否会通知
         * @return 发生改变时服务器是否会通知
         */
        public Boolean getListChanged() {
            return listChanged;
        }

        /**
         * 设置发生改变时服务器是否会通知
         * @param listChanged 发生改变时服务器是否会通知
         */
        public void setListChanged(Boolean listChanged) {
            this.listChanged = listChanged;
        }
    }

    /**
     * 工具能力
     */
    public static class ToolCapabilities {
        /** 发生改变时服务器是否会通知 */
        private Boolean listChanged;

        /**
         * 获取发生改变时服务器是否会通知
         * @return 发生改变时服务器是否会通知
         */
        public Boolean getListChanged() {
            return listChanged;
        }

        /**
         * 设置发生改变时服务器是否会通知
         * @param listChanged 发生改变时服务器是否会通知
         */
        public void setListChanged(Boolean listChanged) {
            this.listChanged = listChanged;
        }
    }
}
